package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;

import edu.client.VentasService.VentasService;
import edu.client.VentasService.VentasServiceAsync;
import edu.shared.DTO.EmpleadoDTO;
import edu.shared.DTO.OrdenPedidoDTO;

public class P_CerrarOrdenPedido extends Composite {
	
	private static final int CHECK = 0;
	private static final int NRO_ORDEN_PEDIDO = 1;
	private static final int CLIENTE = 2;
	private static final int ESTADO = 3;
	private static final int FECHA_PREVISTA_ENTREGA = 4;
	private static final int MAS_INFORMACION = 5;
	
	private Constantes constante = GWT.create(Constantes.class);
	private String tituloTab;

	TabPanel padre;
	private FlexTable ordenesPedidoFt;

	private TextBox nroOrdenPedidoTb;
	private ListBox estadoLb;
	private ListBox clienteLb;

	private Button buscarBtn;

	public OrdenPedidoDTO ordenPedidoDTO;
	public List<EmpleadoDTO> listaEmpleados;
	public List<String> listaEmpleadosACargo;
	public List<OrdenPedidoDTO> ordenesPedidoDTO;
	private Button cerrarOrdenPedidoBtn;
	
	public P_CerrarOrdenPedido(TabPanel padre, String titulo) {

		this.tituloTab = titulo;
		this.padre = padre;
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "637px");
		
		//BÚSQUEDA SIN CRITERIOS
		
		VentasServiceAsync ventasService = GWT.create(VentasService.class);

		ventasService.buscarOrdenesPedido(new AsyncCallback<List<OrdenPedidoDTO>>() {
			@Override
			public void onSuccess(List<OrdenPedidoDTO> result) {
				
				ordenesPedidoDTO = new LinkedList<OrdenPedidoDTO>();
				
				for (OrdenPedidoDTO ordenPedidoDTO : result) {
					if (!ordenPedidoDTO.getEstado().equals("CERRADA"))
						ordenesPedidoDTO.add(ordenPedidoDTO);
				}
					
				cargarOrdenesPedido(ordenesPedidoDTO);
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
		
		ventasService.getNombresEmpresas(new AsyncCallback<List<String>>() {
			public void onSuccess(List<String> result) {
				
				clienteLb.addItem("TODOS LOS CLIENTES");
				clienteLb.addItem("ORDEN PLANIFICADA");
				
				for (int i = 0; i < result.size(); i++)
					clienteLb.addItem(result.get(i).toUpperCase());
			}

			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
		
		// SECCIÓN DATOS DE FILTRADO

		Label buscarPorLabel = new Label("FILTROS");
		buscarPorLabel.setStyleName("labelTitulo");
		layoutPanel.add(buscarPorLabel);
		layoutPanel.setWidgetLeftWidth(buscarPorLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(buscarPorLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label nroOrdenPedidoLabel = new Label("Nº ORDEN DE PEDIDO:");
		nroOrdenPedidoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nroOrdenPedidoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nroOrdenPedidoLabel);
		layoutPanel.setWidgetLeftWidth(nroOrdenPedidoLabel, 2.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nroOrdenPedidoLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		nroOrdenPedidoTb = new TextBox();
		layoutPanel.add(nroOrdenPedidoTb);
		layoutPanel.setWidgetLeftWidth(nroOrdenPedidoTb, 15.5, Unit.PCT, 20.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nroOrdenPedidoTb, 65.0, Unit.PX, 32.0, Unit.PX);
		
		Label clienteLabel = new Label("CLIENTE:");
		clienteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		clienteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(clienteLabel);
		layoutPanel.setWidgetLeftWidth(clienteLabel, 39.0, Unit.PCT, 5.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(clienteLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		clienteLb = new ListBox();
		layoutPanel.add(clienteLb);
		layoutPanel.setWidgetLeftWidth(clienteLb, 44.5, Unit.PCT, 20.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(clienteLb, 65.0, Unit.PX, 32.0, Unit.PX);
		
		Label estadoLabel = new Label("ESTADO:");
		estadoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(estadoLabel);
		layoutPanel.setWidgetLeftWidth(estadoLabel, 69.5, Unit.PCT, 5.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(estadoLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		estadoLb = new ListBox();
		layoutPanel.add(estadoLb);
		layoutPanel.setWidgetLeftWidth(estadoLb, 75.0, Unit.PCT, 20.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(estadoLb, 65.0, Unit.PX, 32.0, Unit.PX);
		
		estadoLb.addItem("TODOS LOS ESTADOS");
		estadoLb.addItem("GENERADA");
		estadoLb.addItem("GUARDADA");
		estadoLb.addItem("INGENIERÍA");
		estadoLb.addItem("PROVISORIA");
		
		buscarBtn = new Button("BUSCAR");			
		layoutPanel.add(buscarBtn);
		layoutPanel.setWidgetLeftWidth(buscarBtn, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(buscarBtn, 120.0, Unit.PX, 28.0, Unit.PX);
		
		buscarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				for (int i = 1; i < ordenesPedidoFt.getRowCount(); i++) {
					ordenesPedidoFt.removeRow(i);
				}
				String nroOrdenCriterio = nroOrdenPedidoTb.getText();
				String clienteCriterio = clienteLb.getItemText(clienteLb.getSelectedIndex());
				String estadoCriterio = estadoLb.getItemText(estadoLb.getSelectedIndex());
				filtrarCriterios(ordenesPedidoDTO, nroOrdenCriterio, clienteCriterio, estadoCriterio);
			}
		});

		// SECCIÓN RESULTADOS DEL FILTRADO
		
		Label ordenesPedidoLabel = new Label("ÓRDENES DE PEDIDO");
		ordenesPedidoLabel.setStyleName("labelTitulo");
		layoutPanel.add(ordenesPedidoLabel);
		layoutPanel.setWidgetLeftWidth(ordenesPedidoLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ordenesPedidoLabel, 160.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel contenedorOrdenesPedidoSp = new ScrollPanel();
		contenedorOrdenesPedidoSp.setStyleName("tabla");
		layoutPanel.add(contenedorOrdenesPedidoSp);
		layoutPanel.setWidgetLeftWidth(contenedorOrdenesPedidoSp, 4.9, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(contenedorOrdenesPedidoSp, 225.0, Unit.PX, 250.0, Unit.PX);
		
		ordenesPedidoFt = new FlexTable();
		contenedorOrdenesPedidoSp.setWidget(ordenesPedidoFt);
		ordenesPedidoFt.setSize("100%", "100%");
		ordenesPedidoFt.setText(0, CHECK, "");
		ordenesPedidoFt.getCellFormatter().setWidth(0, CHECK, "4%");
		ordenesPedidoFt.setText(0, NRO_ORDEN_PEDIDO, "Nº ORDEN PEDIDO");
		ordenesPedidoFt.getCellFormatter().setWidth(0, NRO_ORDEN_PEDIDO, "22%");
		ordenesPedidoFt.setText(0, CLIENTE, "CLIENTE");
		ordenesPedidoFt.getCellFormatter().setWidth(0, CLIENTE, "22%");
		ordenesPedidoFt.setText(0, ESTADO,"ESTADO");
		ordenesPedidoFt.getCellFormatter().setWidth(0, ESTADO, "22%");
		ordenesPedidoFt.setText(0, FECHA_PREVISTA_ENTREGA, "FECHA PREVISTA ENTREGA");
		ordenesPedidoFt.getCellFormatter().setWidth(0, FECHA_PREVISTA_ENTREGA, "22%");
		ordenesPedidoFt.setText(0, MAS_INFORMACION, constante.masInformacion());
		ordenesPedidoFt.getCellFormatter().setWidth(0, MAS_INFORMACION, "8%");
		ordenesPedidoFt.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		//Sección pie.
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, 500.0, Unit.PX, 50.0, Unit.PX);
		
		Button salirBtn = new Button("CANCELAR");
		layoutPanel.add(salirBtn);
		layoutPanel.setWidgetRightWidth(salirBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(salirBtn, 575.0, Unit.PX, 28.0, Unit.PX);
		
		salirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				salir();
			}
		});
		
		cerrarOrdenPedidoBtn = new Button("CERRAR");
		layoutPanel.add(cerrarOrdenPedidoBtn);
		layoutPanel.setWidgetRightWidth(cerrarOrdenPedidoBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cerrarOrdenPedidoBtn, 575.0, Unit.PX, 28.0, Unit.PX);

		cerrarOrdenPedidoBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				cerrarOrdenPedidoBtn.setEnabled(false);
				
				long ordenSeleccionada = Long.parseLong(ordenSeleccionada());
				
				if (ordenSeleccionada == -1) {
					
					Window.alert("Seleccione una orden de pedido.");
					cerrarOrdenPedidoBtn.setEnabled(true);	
				}
				else {
					
					if (Window.confirm("¿Está seguro que desea cerrar esta orden de pedido?")) {
						ordenPedidoDTO = new OrdenPedidoDTO();
						cargarYCerrarOrdenPedido(ordenSeleccionada);
					}
					
					else {
						cerrarOrdenPedidoBtn.setEnabled(true);
					}
				}
			}
		});
	}
	
	private void cargarOrdenesPedido(List<OrdenPedidoDTO> ordenesPedidoDTO) {
		
		int cantidadFilas = ordenesPedidoFt.getRowCount();
		
		for (int i = 1; i < cantidadFilas; i++) {
			ordenesPedidoFt.removeRow(1);
		}
		
		for (int i = 0; i < ordenesPedidoDTO.size(); i++) {

			Label info = new Label("");
			info.setSize("16px", "16px");
			info.setStyleName("labelInfo");
			
			DateTimeFormat fmtDate = DateTimeFormat.getFormat("dd/MM/yyyy");
			String fechaPrevistaEntrega = "";
			
			if (ordenesPedidoDTO.get(i).getFechaPrevistaEntrega() != null)
				fechaPrevistaEntrega = fmtDate.format(ordenesPedidoDTO.get(i).getFechaPrevistaEntrega());
			
			RadioButton radioButton = new RadioButton("Orden seleccionada","");
			
			ordenesPedidoFt.setWidget(i + 1, CHECK, radioButton);
			ordenesPedidoFt.getFlexCellFormatter().setHorizontalAlignment(i + 1, CHECK, HasHorizontalAlignment.ALIGN_CENTER);
			ordenesPedidoFt.setWidget(i + 1, NRO_ORDEN_PEDIDO, new Label(String.valueOf(ordenesPedidoDTO.get(i).getNroOrden())));
			ordenesPedidoFt.getCellFormatter().setWordWrap(i+1, NRO_ORDEN_PEDIDO, true);
			ordenesPedidoFt.setWidget(i + 1, CLIENTE, new Label(ordenesPedidoDTO.get(i).getNombreCliente()));
			ordenesPedidoFt.getCellFormatter().setWordWrap(i+1, CLIENTE, true);
			ordenesPedidoFt.setWidget(i + 1, ESTADO, new Label(ordenesPedidoDTO.get(i).getEstado()));
			ordenesPedidoFt.getCellFormatter().setWordWrap(i+1, ESTADO, false);
			ordenesPedidoFt.setWidget(i + 1, FECHA_PREVISTA_ENTREGA, new Label(fechaPrevistaEntrega));
			ordenesPedidoFt.getCellFormatter().setWordWrap(i+1, FECHA_PREVISTA_ENTREGA, true);
			ordenesPedidoFt.setWidget(i + 1, MAS_INFORMACION, info);
			ordenesPedidoFt.getFlexCellFormatter().setHorizontalAlignment(i + 1, MAS_INFORMACION, HasHorizontalAlignment.ALIGN_CENTER);
			ordenesPedidoFt.getRowFormatter().setStyleName(i + 1, "tablaRenglon");
			
			info.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					Cell celda = ordenesPedidoFt.getCellForEvent(event);
					masInformacionOrdenPedido(celda);
				}
			});
		}			
	}
	
	
	private void filtrarCriterios(List<OrdenPedidoDTO> ordenesPedidoDTO, String nroOrdenCriterio, String clienteCriterio, String estadoCriterio) {
		
		List<OrdenPedidoDTO> ordenesPedidoListar = new LinkedList<OrdenPedidoDTO>();
		
		for (int i = 0; i < ordenesPedidoDTO.size(); i++) {

			String nroOrden = String.valueOf(ordenesPedidoDTO.get(i).getNroOrden());
			String cliente = ordenesPedidoDTO.get(i).getNombreCliente();
			String estado = ordenesPedidoDTO.get(i).getEstado();
			
			if ((clienteCriterio.equals("TODOS LOS CLIENTES"))||(cliente.toUpperCase().equals(clienteCriterio))) {
				if ((estadoCriterio.equals("TODOS LOS ESTADOS"))||(estado.equals(estadoCriterio))) {
					if (nroOrden.startsWith(nroOrdenCriterio)) {
						ordenesPedidoListar.add(ordenesPedidoDTO.get(i));
					}
				}
			}
		}

		cargarOrdenesPedido(ordenesPedidoListar);
	}
	
	
	private void masInformacionOrdenPedido(Cell celda) {		
		long nroOrdenPedido = Long.parseLong(ordenesPedidoFt.getText(celda.getRowIndex(), 1));
		
		final P_DetalleOrdenPedido popUp = new P_DetalleOrdenPedido(nroOrdenPedido);
		popUp.setGlassEnabled(true);
		popUp.center();
		popUp.show();
	}
	
	private void cargarYCerrarOrdenPedido(long nroOrdenPedido) {
		
		VentasServiceAsync ventasService = GWT.create(VentasService.class);
				
		//Se busca el detalle de la orden de pedido.	
		ventasService.getOrdenPedidoCompleta(nroOrdenPedido, new AsyncCallback<OrdenPedidoDTO>() {
			public void onSuccess(OrdenPedidoDTO result) {	
				ordenPedidoDTO = result;
				cerrarOrdenPedido(ordenPedidoDTO.getNroOrden());
			}

			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
				cerrarOrdenPedidoBtn.setEnabled(true);
			}
		});
	}
	
	private void cerrarOrdenPedido(long nroOrdenPedido) {
				
		VentasServiceAsync ventasService = GWT.create(VentasService.class);

		ventasService.cerrarOrdenPedido(ordenPedidoDTO.getNroOrden(), new AsyncCallback<Long>() {
			@Override
			public void onSuccess(Long result) {
				Window.alert("La orden de pedido número " + result + " ha sido cerrada exitosamente.");
				salir();
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
				cerrarOrdenPedidoBtn.setEnabled(true);
			}
		});	
	}
	
	public String ordenSeleccionada() {
		String ordenSeleccionada = "-1";

		for(int i=1; i< ordenesPedidoFt.getRowCount(); i++){
			RadioButton radiobutton = (RadioButton) ordenesPedidoFt.getWidget(i, CHECK);
			
			if(radiobutton.getValue() == true)
				ordenSeleccionada = ordenesPedidoFt.getText(i, 1);
		}
		
		return ordenSeleccionada;
	}
	
	public void salir() {
		padre.remove(Validaciones.numeroElemento(padre, tituloTab));
	}
}
